package com.tlias.filter;

import com.tlias.exception.BusinessException;
import com.tlias.utils.JwtUtils;
import io.jsonwebtoken.Claims;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;

import java.io.IOException;

@Slf4j//过滤器(Filter)
//@WebFilter(urlPatterns = "/*")//过滤器(Filter)
//过滤器(Filter)需要实现过滤器接口(Filter)
public class LogincheckFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

        //强转对象,获取请求对象使用HttpServletRequest里的方法获取请求url
        HttpServletRequest  request = (HttpServletRequest) servletRequest;
        //强转对象,获取响应对象使用HttpServletResponse里的方法用于响应状态码
        HttpServletResponse  response = (HttpServletResponse) servletResponse;
        //1.获取请求url。
        String url = request.getRequestURI();// /login
        log.info("请求的url是{}",url);
        //2.判断请求url是否包含login，如果包含，放行。
        if(url.contains("login")){
            log.info("本次为登录请求不需要处理");
            filterChain.doFilter(servletRequest,servletResponse);//放行
            return;//结束本次请求,继续下一个过滤器或者Servlet中处理资源防止错误
        }
        //3.获取请求头中的令牌(token)。
        String token = request.getHeader("token");
        //4.判断令牌是否存在，如果不存在，响应401.
        log.info("获取的令牌是{}",token);
        if(token == null){
            log.error("未登录，请先登录!");
            response.setStatus(401);//响应状态码
//            throw new BusinessException("未登录，请先登录!");
            return;

        }
        //5.解析token，如果解析失败，响应401。
        try {
            Claims claims = JwtUtils.parseJwt(token);
            log.info("解析的令牌是{}",claims);
        } catch (Exception e) {
            response.setStatus(401);
            log.error("令牌解析失败，请重新登录!");
//            throw new BusinessException("未登录，请先登录!");
            return;
        }
        //6.解析成功，放行。
        filterChain.doFilter(servletRequest,servletResponse);
    }
}
